/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.easoftware.code.dao;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.inject.Inject;
import javax.inject.Named;
import net.easoftware.code.beans.QueryParameter;
import net.easoftware.code.beans.facade.LineaNegocio;
import net.easoftware.code.beans.facade.PerfilDatosFc;
import net.easoftware.code.beans.facade.PerfilSeguridadFc;
import net.easoftware.code.beans.facade.UnidadNegocio;
import net.easoftware.code.beans.facade.UsuarioDbFc;
import net.easoftware.code.beans.facade.UsuarioFc;
import net.easoftware.code.beans.jpa.PerfilDatos;
import net.easoftware.code.beans.jpa.PerfilDatosLineanegocio;
import net.easoftware.code.beans.jpa.PerfilDatosUnidadnegocio;
import net.easoftware.code.beans.jpa.PerfilSeguridad;
import net.easoftware.code.beans.jpa.Usuario;
import net.easoftware.code.error.EaError;
import net.easoftware.code.mb.MbPerfilesDatos;
import net.easoftware.code.util.Tools;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

/**
 *
 * @author waumovil-javaengineer
 */
@Named("seguridadDao")
public class SeguridadDao implements Serializable {

    @Inject
    private DSManager dSManager;
    @EJB
    PersistenceEjb ejb;

    public List<UsuarioDbFc> getUsuarios() throws EaError {
        List<net.easoftware.code.beans.jpa.Usuario> r = (List<net.easoftware.code.beans.jpa.Usuario>) ejb.doNamedQuery("Usuario.findAll", new QueryParameter[]{}, PersistenceEjb.LIST);
        List<UsuarioDbFc> nRs = new LinkedList<>();
        for (net.easoftware.code.beans.jpa.Usuario ln : r) {
            UsuarioDbFc u = (UsuarioDbFc) Tools.cloneObject(ln, UsuarioDbFc.class);
            u.setFcperfilDatos((PerfilDatosFc) Tools.cloneObject(ln.getPerfilDatos(), PerfilDatosFc.class));
            u.setFcperfilSeguridad((PerfilSeguridadFc) Tools.cloneObject(ln.getPerfilSeguridad(), PerfilSeguridadFc.class));
            nRs.add(u);

        }
        return nRs;
    }

    /**
     * valida usuario para la accion de login
     *
     * @param usuario
     * @throws EaError
     */
    public void isUsuarioValido(UsuarioFc usuario) throws EaError {
        List<UsuarioFc> lcUsr;
        try {
            QueryRunner q = new QueryRunner(dSManager.getDs());
            ResultSetHandler<List<UsuarioFc>> h = new BeanListHandler(UsuarioFc.class);
            lcUsr = q.query("select * from usuario where usuario = ?", h, usuario.getUsuario());
            if (lcUsr.isEmpty()) {
                throw new EaError("El usuario es invalido");
            } else {
                if (!lcUsr.get(0).getClave().equalsIgnoreCase(usuario.getClave())) {
                    throw new EaError("La clave es incorrecta");
                } else {
                    UsuarioFc usr = (UsuarioFc) lcUsr.get(0);
                    usuario.setNombres(usr.getNombres());
                    usuario.setApellidos(usr.getApellidos());
                    usuario.setCorreo(usr.getCorreo());
                    usuario.setLoged(true);
                }
            }
        }
        catch (SQLException | EaError ex) {
            throw new EaError("Error interno al validar usuario!", ex);
        }
    }

    public void validateUsuer(UsuarioFc usuario) throws EaError {
        Usuario u = (Usuario) ejb.doNamedQuery("Usuario.findByUsuario", new QueryParameter[]{new QueryParameter("usuario", usuario.getUsuario())},
                PersistenceEjb.SINGLE);
        if (u != null) {
            if (u.getClave().equals(usuario.getClave())) {
                usuario.setLoged(u.getEstado() == 1);
                if (usuario.isLoged()) {
                    usuario.setApellidos(u.getApellidos());
                    usuario.setNombres(u.getNombres());
                    usuario.setCorreo(u.getCorreo());
                    usuario.setTipo(u.getTipo());
                    try {
                        PerfilSeguridadFc psFc = (PerfilSeguridadFc) Tools.cloneObject(u.getPerfilSeguridad(), PerfilSeguridadFc.class);
                        PerfilDatos pd = u.getPerfilDatos();
                        PerfilDatosFc pdfc = (PerfilDatosFc) Tools.cloneObject(pd, PerfilDatosFc.class);
                        pdfc.setRef(pd);
                        List<PerfilDatosLineanegocio> perfilDatosLineanegocioList = pd.getPerfilDatosLineanegocioList();
                        for (PerfilDatosLineanegocio pdln : perfilDatosLineanegocioList) {
                            pdfc.getLineas().add((LineaNegocio) Tools.cloneObject(pdln.getLineanegocio(), LineaNegocio.class));
                        }
                        List<PerfilDatosUnidadnegocio> perfilDatosUnidadnegocioList = pd.getPerfilDatosUnidadnegocioList();
                        for (PerfilDatosUnidadnegocio pdun : perfilDatosUnidadnegocioList) {
                            pdfc.getUnidades().add((UnidadNegocio) Tools.cloneObject(pdun.getUnidadnegocio(), UnidadNegocio.class));
                        }
                        usuario.setPd(pdfc);
                        usuario.setPs(psFc);
                        u.setUltimoIngreso(Calendar.getInstance().getTime());
                        ejb.actualizar(u);
                    }
                    catch (EaError ex) {
                        Logger.getLogger(MbPerfilesDatos.class.getName()).log(Level.SEVERE, null, ex);
                    }

                } else {
                    throw new EaError("El usuario esta deshabilitado!");
                }
            } else {
                throw new EaError("La clave es incorrecta");
            }
        } else {
            throw new EaError("El usuario no existe!");
        }
    }

    /**
     *
     * @param usuario
     * @return
     * @throws EaError
     */
    public boolean agregar(UsuarioDbFc usuario) throws EaError {
        ejb.guardar(usuario.getEntityBean());
        return false;
    }

    /**
     *
     * @param usuario
     * @return
     * @throws EaError
     */
    public boolean eliminar(UsuarioDbFc usuario) throws EaError {
        ejb.eliminar(usuario.getEntityBean());
        return true;
    }

    /**
     *
     * @param usuario
     * @return
     * @throws EaError
     */
    public boolean actualizar(UsuarioDbFc usuario) throws EaError {
        PerfilDatos pd = (PerfilDatos) usuario.getFcperfilDatos().getEntityBean();
        PerfilSeguridad ps = (PerfilSeguridad) usuario.getFcperfilSeguridad().getEntityBean();
        Usuario u = (Usuario) usuario.getEntityBean();
        u.setPerfilDatos(pd);
        u.setPerfilSeguridad(ps);
        ejb.actualizar(u);
        return true;
    }
}
